import time
import itertools
import requests

from selenium.webdriver.common.by import By

from browser import Browser



class ParserProxy(Browser):

    """ Парсим прокси """

    def __init__(self, display_browser):

        self.display_browser = display_browser[0]
        self.link_to_website = 'https://hidemy.name/ru/proxy-list/'


    def get_configured_browser(self, proxy=None):

        """ Получаем настроенный браузер """

        browser = self.get_browser(self.display_browser, proxy)

        return browser


    def start_parsing_proxy(self):

        """ Начинаем парсить прокси """

        browser = self.get_configured_browser()
        browser.get(self.link_to_website)

        proxy_list = self.get_proxy_list(browser)
        print(proxy_list)
        print(len(proxy_list))
        verified_proxy_list = self.get_verified_proxy_list(proxy_list)

        return verified_proxy_list


    def get_proxy_list(self, browser):

        """ Получаем список прокси """

        def get_ip_list(browser):

            """ Получаем список ip """

            ip_list = browser.find_elements(
                By.XPATH,
                '//table/tbody/tr/td[1]'
            )
            done_ip_list = [item.text for item in ip_list]

            return done_ip_list


        def get_port_list(browser):

            """ Получаем список портов """

            port_list = browser.find_elements(
                By.XPATH,
                '//table/tbody/tr/td[2]'
            )
            done_port_list = [item.text for item in port_list]

            return done_port_list


        def combine_ip_and_port(ip_list, port_list):

            """ Объединяем ip и порт """

            done_proxies = []

            for ip, port in itertools.zip_longest(ip_list, port_list):

                entry = f'{ip}:{port}'
                done_proxies.append(entry)

            return done_proxies


        # ВЫШЕ ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

        ip_list = get_ip_list(browser)
        port_list = get_port_list(browser)
        done_proxies = combine_ip_and_port(ip_list, port_list)

        return done_proxies


    def get_verified_proxy_list(self, proxy_list):

        """ Получаем проверенный список прокси """

        verified_proxy_list = []

        for i, proxie in enumerate(proxy_list, 1):

            link = 'https://api.ipify.org/'
            proxies = {'http': f'http://{proxie}', 'https': f'http://{proxie}'}

            try:

                response = requests.get(link, proxies=proxies, timeout=2).text
                verified_proxy_list.append(proxie)

                print(f'{i} - {response}')

            except:

                print(f'{i} - Невалидный прокси')

        return verified_proxy_list
